public class URShift {
    public static void main(String[] args) {
        int i = 10;
        int j = i >> 1;
        System.out.println("i: " + Integer.toBinaryString(i));  // 1010
        System.out.println("j: " + Integer.toBinaryString(j));  // 0101
        int k = i >>> 1;
        System.out.println("k: " + Integer.toBinaryString(k));  // 0101

        i = -1;
        int m = i >>> 1;
        System.out.println("l: " + Integer.toBinaryString(i));  // 11111111111111111111111111111111
        System.out.println("m: " + m); // 2147483647
        System.out.println("m: " + Integer.toBinaryString(m));  // 01111111111111111111111111111111
        long l = -1L;
        System.out.println("l: " + Long.toBinaryString(l));  // 1111111111111111111111111111111111111111111111111111111111111111
        short s = -1;
        System.out.println("s: " + Integer.toBinaryString(s));  // 11111111111111111111111111111111
        byte b = -1;
        System.out.println("b: " + Integer.toBinaryString(b));  // 11111111111111111111111111111111
    }
}

/*
左移运算符 <<
二进制位整体向左移动，低位补0
数学等价：x << n = x × 2ⁿ
10 << 1 → 00001010 → 00010100（20）

有符号右移 >>
二进制位整体向右移动，高位补符号位
数学等价：x >> n = x ÷ 2ⁿ（向负无穷取整）
-8 >> 1 → 11111111111111111111111111111000
          → 11111111111111111111111111111100（-4）

无符号右移 >>>
二进制位整体向右移动，高位补0
总是得到非负数
-1 >>> 1 → 11111111111111111111111111111111
          → 01111111111111111111111111111111（2147483647）
 */